package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;
import java.util.HashMap;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.EstadosListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class ABuscaProfissionais extends DockPanel
{
	private DisclosurePanel buscaAvancadaPanel;
	
	private DecoratorPanel buscaPanel;

	private FlexTable buscaBasicaGrid;
	private FlexTable buscaAvancadaGrid;

	
	private TextBox nomeTxt;
	private TextBox idadeLimiteTxt;
	private TextBox cursoTxt;
	private FlowPanel gridConhecimentos;
	private EstadosListBox estadosCb;
	
	private Button buscarBtn;
	private Button limparBtn;

	public ABuscaProfissionais()
	{
		inicializaComponentes();
		setarTamanhoComponentes();

		// monta o formulario de busca basica...
		buscaBasicaGrid.setWidget(0, 0, new HTML("<b>Entre com os critérios de busca:</b>"));
		buscaBasicaGrid.getFlexCellFormatter().setColSpan(0, 0, 2);
		buscaBasicaGrid.getFlexCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

		buscaBasicaGrid.setWidget(1, 0, new HTML("Nome:"));
		buscaBasicaGrid.setWidget(1, 1, nomeTxt);
		
		buscaBasicaGrid.setWidget(2, 0, new HTML("Estado:"));
		buscaBasicaGrid.setWidget(2, 1, estadosCb);
		


		
		// monta o formulario de busca avancada...
		buscaAvancadaGrid.setWidget(0, 0, new HTML("Idade Limite:"));
		buscaAvancadaGrid.setWidget(0, 1, idadeLimiteTxt);
		
		buscaAvancadaGrid.setWidget(1, 0, new HTML("Curso:"));
		buscaAvancadaGrid.setWidget(1, 1, cursoTxt);
		
		/*
		buscaAvancadaGrid.setWidget(2, 0, new HTML("Conhecimentos:"));
		buscaAvancadaGrid.setWidget(2, 1, gridConhecimentos);
		*/

		buscaAvancadaPanel.setContent(buscaAvancadaGrid);

		buscaBasicaGrid.setWidget(3, 0, buscaAvancadaPanel);
		buscaBasicaGrid.getFlexCellFormatter().setColSpan(3, 0, 2);
		
		// ajeita os botoes na grid
		FlexTable botoesAuxGrid = new FlexTable();
		botoesAuxGrid.setWidget(0, 0, buscarBtn);
		botoesAuxGrid.setWidget(0, 1, limparBtn);

		// coloca os botoes no formulario
		buscaBasicaGrid.setWidget(4, 0, botoesAuxGrid);
		buscaBasicaGrid.getFlexCellFormatter().setColSpan(4, 0, 2);
		buscaBasicaGrid.getFlexCellFormatter().setAlignment(4, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

		buscaPanel.add(buscaBasicaGrid);

		this.add(buscaPanel, DockPanel.CENTER);
		
		// ACAO PARA BOTAO LIMPAR
		limparBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					nomeTxt.setText("");
					idadeLimiteTxt.setText("");
					idadeLimiteTxt.setText("");
				}
			}
		);

		// ACAO PARA BOTAO BUSCAR
		buscarBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					if (nomeTxt.getText().equals("") 
						&& idadeLimiteTxt.getText().equals("") 
						&& cursoTxt.getText().equals("")
						&& estadosCb.getValue(estadosCb.getSelectedIndex()).equals(""))
					{
						InformationDialogBox infoDialogBox = new InformationDialogBox("Insira pelo menos um critério para efetuar a busca.");
						infoDialogBox.center();
						infoDialogBox.show();

						return;
					}

					AsyncCallback<ArrayList<BeanProfissionalAssinante>> cbResultadoBusca = new AsyncCallback<ArrayList<BeanProfissionalAssinante>>()
					{
						public void onSuccess(ArrayList<BeanProfissionalAssinante> clProfissionais)
						{
							ABuscaProfissionais.this.remove(buscaPanel);
							ABuscaProfissionais.this.add(new ABuscaProfissionaisResultado(clProfissionais), DockPanel.CENTER);
						}

						public void onFailure(Throwable caught)
						{
							ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar profissionais: " + caught.getMessage());
							errorDialogBox.center();
							errorDialogBox.show();
						};
					};
					
					Integer idade = null;
					Integer estado = null;
					
					if(!idadeLimiteTxt.getText().equals(""))
						idade = Integer.parseInt(idadeLimiteTxt.getText());
					if(!estadosCb.getValue(estadosCb.getSelectedIndex()).equals(""))
						estado = Integer.parseInt(estadosCb.getValue(estadosCb.getSelectedIndex()));

					ArrayList<String> conhecimentos = new ArrayList<String>();
					/*
					CheckBox selectConhecimento = new CheckBox();;
					ArrayList<String> conhecimentos = new ArrayList<String>();

					while(gridConhecimentos.iterator().hasNext())
					{
						selectConhecimento = ((CheckBox) gridConhecimentos.iterator().next().);
						if(selectConhecimento.isChecked())
							conhecimentos.add(selectConhecimento.getText());
					}
					
					*/
					Util.getService().buscarProfissionais(nomeTxt.getText(), idade, estado, cursoTxt.getText(), conhecimentos, cbResultadoBusca);
				}
			}
		);
	}

	private void inicializaComponentes()
	{
		gridConhecimentos = new FlowPanel();
		
		AsyncCallback<HashMap<Integer, String>> clCurConhecimento = new AsyncCallback<HashMap<Integer, String>>() 
		{
			public void onSuccess(HashMap<Integer, String> result) 
			{
				for (int i = 1; i < result.size(); i++) 
				{
					  CheckBox ck = new CheckBox(result.get(i));
					  gridConhecimentos.add(ck);
				}
			}  
			public void onFailure(Throwable caught) 
			{
				ErrorDialogBox erroConhecimento = new ErrorDialogBox("Erro ao buscar conhecimento" + caught.getMessage());
				erroConhecimento.show();
			}
		};
		
		Util.getService().getConhecimentos(clCurConhecimento);
			
		buscaAvancadaPanel = new DisclosurePanel("Busca avançada");
		buscaAvancadaPanel.setAnimationEnabled(true);

		buscaPanel = new DecoratorPanel();

		buscaBasicaGrid = new FlexTable();
		buscaAvancadaGrid = new FlexTable();

		nomeTxt = new TextBox();
		idadeLimiteTxt = new TextBox();
		cursoTxt = new TextBox();
		estadosCb = new EstadosListBox();

		buscarBtn = new Button("Buscar");
		limparBtn = new Button("Limpar");
	}


	private void setarTamanhoComponentes()
	{
		buscaBasicaGrid.setCellSpacing(5);
		buscaAvancadaGrid.setCellSpacing(5);

		nomeTxt.setWidth("280px");
		idadeLimiteTxt.setWidth("30px");
		cursoTxt.setWidth("280px");
		//gridConhecimentos.setWidth("280px");
	}
}